package beans;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

import beans.exceptions.NotConnectedException;

import dao.EntityAlreadyExistsException;
import dao.InexistantEntityException;
import entities.Client;

@ManagedBean
@RequestScoped
public class ClientBean extends SuperBean {
    
    @ManagedProperty(value = "#{mainBean}")
    private MainBean mainBean;
    
    //nécessaire pour la modification et la suppression
    @ManagedProperty("#{param.idClient}")
    private Integer id;
    
    private String nom;

    private String prenom;
    
    
    public void setId(Integer id) {
        this.id = id;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }
    
    public Integer getId() {
        return id;
    }
    
    //nécessaire car sinon : The class 'beans.ClientAction' does not have a readable property 'nom'.
    public String getNom() {
        return nom;
    }

    public String getPrenom() {
        return prenom;
    }
    
    public void setMainBean(MainBean mainBean) {
        this.mainBean = mainBean;
    }
    
    
    public List<Client> getClients() {
        
        return (List<Client>) mainBean.getGestionnaire().getAll(Client.class);
        
    }
    
    public void nouveauClient()
    {
        try
        {
            mainBean.getGestionnaire().creerClient(nom, prenom);
            mainBean.setMessage("Le client a été correctement créé.");
            nom = "";
            prenom = "";
            
        } catch (EntityAlreadyExistsException ex) {
            mainBean.setMessage(ex.toString());
        }
        
        //on reste sur la même page donc pas besoin de return String pour faces-config.xml
    }
    
    /**
     * Préparation de modifierClientForm.xhtml avec les données du client à modifier
     * @param GET idClient = id
     */
    public void modifierClientForm()
    {
        if(id != null)
        {
            try
            {
                Client client = (Client) mainBean.getGestionnaire().get(Client.class, id);
                id = client.getId();
                nom = client.getNom();
                prenom = client.getPrenom();
            }
            catch(InexistantEntityException ex)
            {
                mainBean.setMessage(ex.toString());
            }
        }
        else
            mainBean.setMessage("idClient est null");
    }
    
    public String modifierClient()
    {
        try
        {
            mainBean.getGestionnaire().modifierClient(id, nom, prenom);
            mainBean.setMessage("Le client " + id + " a été correctement modifié.");
        }
        catch(InexistantEntityException ex)
        {
            mainBean.setMessage(ex.toString());
        }
        
        return BeanFunctions.SUCCESS;
    }
    
    //si on reste sur la même page, pas besoin de return String pour faces-config.xml
    //si on veut forward sur une autre page, faut return String pour faces-config.xml (marche pas ici)
    public void supprimerClient()
    {
        if(id != null)
        {
            try 
            {
                try
                {
                    //Déconnecter le client s'il est celui qu'on veut supprimer
                    if(id == sessionBean.getSessionClientId())
                        sessionBean.deconnexion();

                } catch (NotConnectedException ex) {
                    //ne rien faire
                }
                
                mainBean.getGestionnaire().supprimerClient(id);
                mainBean.setMessage("Le client " + id + " a été correctement supprimé.");

            } catch (InexistantEntityException ex) {
                mainBean.setMessage(ex.toString());
            }
        }
        else
            mainBean.setMessage("idClient est null");
        
    }

}
